package packageComune;

import java.io.BufferedReader;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;


//per quando server deve inviare messaggi via socket al client (o rmi)
//solo per il cambio di turno in teoria


public class ClientProxy implements InterfacciaClient {

	
	ServerSocket providerSocket;
	Socket connection = null;
	BufferedReader br;
	BufferedWriter bw;
	
	
	
	/**
	 * Metodo che il server invoca per inviare risposte al client.
	 *  
	 * @param mess Messaggio di risposta da inviare al client.
	 * @return Messaggio letto se l'operazione va a buon fine, null se si genera un eccezione.
	 */
	public String rispostaServer(String mess){	
		this.sendToClient(mess);
		return "";
	}

	/**
	 * Crea un server socket per la connessione al client.
	 */
	public void creaServer(){
		//1. creating a server socket
		try {
			providerSocket = new ServerSocket(9990, 10);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Attende una connessione da parte di un Client e, una volta avvenuta,
	 * ritorna la connessione stessa, nella forma di un socket.
	 *
	 * @return La connessione di tipo socket.
	 */
	public Socket attesaConn(){
		try{	
		connection = providerSocket.accept();		
		}catch(IOException ioException){
				ioException.printStackTrace();
			}
		
		return connection;
		
	}
	
	
	/**
	 * Inizializza i buffer di lettura e scrittura per la connessione via socket.
	 *  
	 * @param connection Socket ricevuto.
	 */
	public void inizializzaBuffer(Socket connection){
		try {
			br=new BufferedReader(new InputStreamReader(connection.getInputStream()));
			bw= new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
	}
	
	

	/**
	 * Chiama metodo per ricevere un messaggio dal Client e controlla che non generi eccezioni.
	 * 
	 * @return Messaggio letto se l'operazione va a buon fine, null se si genera un eccezione.
	 */
	public String receiveFromClient(){
		try{
			
			return br.readLine();
			
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
		return null;
	}
	

	/**
	 * Invia un messaggio al Client nella forma di una stringa e controlla che non si generino eccezioni.
	 * 
	 * @param msg Messaggio da inviare al Client.
	 */
	public void sendToClient(String msg){
		try{
			bw.write(msg);
			bw.newLine();
			bw.flush();
			
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
		
	}	
	
	
	/**
	 * Chiude la connessione attiva tra Clien e Server. Cattura eventuali eccezioni.
	 * 
	 * @param socket Il socket di connessione che deve essere chiuso.
	 */
	public void closeConn(Socket socket){
		try{
			br.close();
			bw.close();
			socket.close();
		}
		catch(IOException ioException){
			ioException.printStackTrace();
		}
	}
}
